package 异常的处理.异常的捕获.trycatch捕获并处理;

import java.io.File;
import java.io.FileNotFoundException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-21
 * Time: 18:31
 */
public class Config1 {
    File file;

    public void openConfig(String filename) throws FileNotFoundException {
        if (!filename.equals("config.ini")) {
            throw new FileNotFoundException("配置文件名字不对");
        }
        //打开文件
    }

    public void readConfig() {

    }
    //2.
    public static void main1(String[] args) {
        try {
            int[] array = {1, 2, 3, 4, 5};
            System.out.println(array[5]);//此处会抛出ArrayIndexOutOfBoundsException
        } catch (NullPointerException e) {//捕获时捕获的是空指针异常 -> 真正的异常无法被捕获到
            e.printStackTrace();
        }

        System.out.println("后序代码");
    }
    /**
     * 编译报错：
     * Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
     */

    //3，
    public static void main2(String[] args) {
        int[] array = {1, 2, 3, 4, 5};

        try {
            System.out.println("before");
            System.out.println(array[10]);
            System.out.println("after");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组下标越界异常");
            e.printStackTrace();
        } catch (NullPointerException e) {
            System.out.println("空指针异常");
            e.printStackTrace();
        }
        System.out.println("after try catch");
    }

    //4.
    /*public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        try {
            System.out.println("before");
            array = null;
            System.out.println(array[10]);
            System.out.println("after");
        }catch (Exception e) {//Exception可以捕获到所有异常
            e.printStackTrace();
        } catch (NullPointerException e) {//永远都捕获不到，执行不了
            e.printStackTrace();
        }
        System.out.println("after try catch");
    }*/

    /**
     * java: 已捕获到异常错误java.lang.NullPointerException
     */

    //4.
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        try {
            System.out.println("before");
            array = null;
            System.out.println(array[10]);
            System.out.println("after");
        }catch (Exception e) {//Exception可以捕获到所有异常
            e.printStackTrace();
        }
        System.out.println("after try catch");
    }
}

/*
【注意事项】
1. try块内抛出异常后，其位置后的代码将不会被执行了
2. 如果抛出异常类型与catch时异常 不匹配，即异常不会被成功捕获，也就不会被处理，继续往外抛，直到JVM收到后中断程序 。异常是按照类型来捕获的
3. try中可能会抛出多个不同的异常对象，则必须用多个catch来捕获 。即多种捕获，多次捕获
  3.1 如果多个异常的处理方式是完全相同，也可以写成这样：
  catch (ArrayIndexOutOfBoundsException | NullPointerException e) {
        ...
  }

  3.2 如果异常之间具有父子类关系，一定是子类异常在前一个catch，父类异常在后catch，否则语法错误：
4. 可以通过一个catch捕获所有的异常。即多个异常，一次捕获

由于Exception类是所有异常类的父类，因此可以用这个类表示捕获所有异常。
备注: catch 进行类型匹配的时候, 不光会匹配相同类型的异常对象, 也会捕捉目标异常类型的子类对象.
如刚才的代码, NullPointerException 和 ArrayIndexOutOfBoundsException 都是 Exception 的子类,
因此都能被捕获到.
 */
